# -*- coding: utf-8 -*-
"""
@Time    : 2024/7/10 11:45 
@Author  : ZhangShenao 
@File    : custom_param_decorator.py 
@Desc    : 自定义参数的装饰器

使用内置的装饰器@functools.wraps,可以保留被装饰函数的元数据
也就是将原函数的元信息,拷贝到对应的装饰器函数里

"""
import functools


def repeat(times: int):
    """
    自定义参数装饰器,实现将原函数重复调用
    :param times: 重复调用的次数
    """

    def my_decorator(f):
        @functools.wraps(f)  # 使用内置的装饰器@functools.wraps,可以保留被装饰函数的元数据,也就是将原函数的元信息,拷贝到对应的装饰器函数里
        def wrapper(*args, **kwargs):
            print(f'invoke function {times} times')
            for i in range(times):
                f(*args, **kwargs)

        return wrapper

    return my_decorator


@repeat(4)
def greeting(name: str):
    """被装饰的函数"""
    print(f'Hello: {name}')


if __name__ == '__main__':
    greeting('zsa')

    # 原函数被装饰后,它的name变成了wrapper,即函数的元信息发生了改变
    # 使用内置的装饰器@functools.wraps,可以保留被装饰函数的元数据
    # 也就是将原函数的元信息,拷贝到对应的装饰器函数里
    print(f'name of greeting function is: {greeting.__name__}')
